算术平均值: 3.0
def 和 lambda 两种函数定义方式函数将一系列操作封装起来,使代码更加:
在金融计算中,收益率、波动率、VaR 等指标需要反复计算,函数是实现这一目标的关键工具。
对于收益率序列 \(r_1, r_2, \ldots, r_n\),算术平均定义为:
\[ \large{ \bar{r} = \frac{1}{n} \sum_{i=1}^{n} r_i = \frac{r_1 + r_2 + \cdots + r_n}{n} } \]
金融含义:算术平均收益率适用于——
| 特性 | 算术平均 | 几何平均 |
|---|---|---|
| 公式 | \(\bar{r}_A = \frac{1}{n}\sum r_i\) | \(\bar{r}_G = [\prod(1+r_i)]^{1/n} - 1\) |
| 应用场景 | 单期期望收益 | 多期复利增长 |
| 数值关系 | \(\bar{r}_A \geq \bar{r}_G\) | 波动率越大,差距越大 |
| 金融含义 | 期初财富的期望增长率 | 期末财富的实际增长率 |
关键理解:想知道”平均每期赚多少”→ 算术平均;计算”长期复利增长”→ 几何平均。
def 关键字def 是 Python 中最常用的函数定义方式:
def:函数定义关键字parameters:参数列表,多个参数用逗号分隔return:返回值,无 return 则返回 Nonedef 定义算术平均函数算术平均值: 3.0
sum(numbers):计算列表元素总和len(numbers):获取列表长度/:执行浮点除法(Python 3 特性)lambda 表达式lambda 用于定义匿名函数,适合简单的单行函数:
lambda计算结果: 3.0
lambda 的限制:只能包含单个表达式,不能包含语句(如 if、for、while)。
def vs. lambda:如何选择?第一步:定义 lambda 函数
A_mean = lambda x: sum(x) / len(x)x 是一个列表,sum(x) 求和,len(x) 求长度第二步:创建数据
sh000001 列表包含上证指数5年的年收益率(%)第三步:计算并输出
sum = 75.5762,len = 5mean = 75.5762 / 5 = 15.11524round(15.11524, 2) → 15.12上证指数在样本期内的平均年收益率约为 15.12%,这意味着:
def calculate_mean_return(returns, decimals=2):
"""
计算算术平均收益率
参数:
returns (list): 收益率序列
decimals (int): 保留小数位数,默认为2
"""
# 参数验证:检查输入有效性
if not returns:
raise ValueError('收益率列表不能为空')
if not all(isinstance(r, (int, float)) for r in returns):
raise ValueError('收益率必须为数值类型')
# 计算并返回
mean = sum(returns) / len(returns)
return round(mean, decimals)
# 使用示例
sh000001 = [26.468, -10.7081, 2.8477, 43.5348, 13.4337]
result = calculate_mean_return(sh000001, decimals=3)
print(f'上证指数平均收益率: {result:.3f}%')上证指数平均收益率: 15.115%
decimals=2)map 批量计算# 投资组合中各股票的收益率
portfolio_returns = {
'Stock A': [0.05, 0.03, -0.02, 0.04, 0.06],
'Stock B': [0.08, 0.02, 0.01, -0.03, 0.05],
'Stock C': [-0.01, 0.04, 0.07, 0.02, 0.03]
}
# 用lambda + map批量计算每只股票的平均收益率
mean_calculator = lambda returns: round(sum(returns) / len(returns), 4)
mean_returns = list(map(mean_calculator, portfolio_returns.values()))
for name, mean_r in zip(portfolio_returns.keys(), mean_returns):
print(f'{name} 平均收益率: {mean_r}')Stock A 平均收益率: 0.032
Stock B 平均收益率: 0.026
Stock C 平均收益率: 0.03
filter 筛选数据# 使用filter筛选正收益
returns_data = [0.05, -0.02, 0.03, -0.01, 0.08, -0.04]
positive_returns = list(filter(lambda r: r > 0, returns_data))
negative_returns = list(filter(lambda r: r < 0, returns_data))
print(f'正收益: {positive_returns}')
print(f'负收益: {negative_returns}')
print(f'胜率: {len(positive_returns)/len(returns_data):.1%}')正收益: [0.05, 0.03, 0.08]
负收益: [-0.02, -0.01, -0.04]
胜率: 50.0%
filter(function, iterable) 根据条件筛选元素reduce 计算累积收益from functools import reduce
# 计算累积收益率(复利效果)
returns = [0.05, 0.03, -0.02, 0.04]
# reduce逐步累积:1 → 1*(1+0.05) → 1.05*(1+0.03) → ...
cumulative_return = reduce(lambda x, y: x * (1 + y), returns, 1) - 1
print(f'各期收益率: {returns}')
print(f'算术平均收益率: {sum(returns)/len(returns):.4f}')
print(f'累积收益率: {cumulative_return:.4f}')各期收益率: [0.05, 0.03, -0.02, 0.04]
算术平均收益率: 0.0250
累积收益率: 0.1023
reduce 对序列进行累积计算1 代表初始本金1 得到净收益率算术平均虽然简单直观,但在金融应用中存在重要局限:
import numpy as np
from scipy import stats
# 包含极端值的收益率数据
returns = [0.05, 0.03, 0.04, 0.50, 0.02, -0.10, 0.06]
# 四种集中趋势度量的比较
arithmetic_mean = np.mean(returns)
median = np.median(returns)
trimmed_mean = stats.trim_mean(returns, 0.1)
winsorized_mean = stats.mstats.winsorize(
np.array(returns), limits=[0.1, 0.1]
).mean()
print(f'算术平均: {arithmetic_mean:.4f}')
print(f'中位数: {median:.4f}')
print(f'截尾平均: {trimmed_mean:.4f}')
print(f'缩尾平均: {winsorized_mean:.4f}')算术平均: 0.0857
中位数: 0.0400
截尾平均: 0.0857
缩尾平均: 0.0857
| 场景 | 推荐统计量 | 理由 |
|---|---|---|
| 正常分布数据 | 算术平均 | 最优无偏估计 |
| 含极端值 | 中位数/截尾平均 | 稳健性强 |
| 投资组合基准 | 算术平均 | 与 CAPM 模型一致 |
| 长期绩效评估 | 几何平均 | 反映真实复利增长 |
def(复杂逻辑)vs. lambda(简单计算)map(批量计算)、filter(筛选)、reduce(累积)[商业大数据分析与应用]